package cn.vastbase.jdbc.param;

import org.junit.Test;

import java.sql.*;

/**
 * 连接参数测试
 */
public class ConnParamsTestCase {

    /**
     * autosave 参数测试。autosave=always时，事务的每一个语句都会自动设置保存点。如果执行失败，只会回滚到上个保存点。
     * 下面的代码，第一个PreparedStatement在数据库中的trace id是0，代表主事务。 其他的每个新的PreparedStatement都会
     * create table temp_1000(id int)
     * 数据库日志:https://doc.weixin.qq.com/doc/w3_AZoAWgb3AFU9mFS1SxvTRyDjCagj3?scode=AHUAfwdSAA8p6eWbPvAZoAWgb3AFU
     */
    @Test
    public void testAutosave() throws Exception {
        String url = "jdbc:postgresql://192.168.56.12:6000/test?currentSchema=public&autosave=always&loggerLevel=off";
        String username = "test";
        String passwd = "Vastdata#0730";
        try (Connection conn = DriverManager.getConnection(url, username, passwd)) {
            conn.setAutoCommit(false);
            // 清表
            try (PreparedStatement ps = conn.prepareStatement("truncate table temp_1000")) {
                ps.executeUpdate();
            }

            // 循环插入
            // 并且没有批量执行,所以每次都会产生SAVEPOINT PGJDBC_AUTOSAVE
            for (int i = 0; i < 10; i++) {
                try (PreparedStatement ps = conn.prepareStatement("insert into temp_1000 values(?)")) {
                    ps.setInt(1, i);
                    ps.executeUpdate();
                }
            }

            // 批量执行更新
            // 只会产生一个SAVEPOINT PGJDBC_AUTOSAVE. 新的PreparedStatement会是一个子事务
            // a字段不存在,所以会报错，由于使用了autosave=always,所以之前的插入数据不会回滚。
            try (PreparedStatement ps = conn.prepareStatement("update temp_1000 set a=id+100 where id = ?")) {
                for (int i = 0; i < 10; i++) {
                    ps.setInt(1, i);
                    ps.addBatch();
                }
                ps.executeBatch();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            // 查询结果
            try (PreparedStatement ps = conn.prepareStatement("select * from temp_1000");
                 ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println(rs.getInt(1));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
